// const cluster = require('cluster');//引入多线程
// const numCPUs = require('os').cpus().length; //引入系统核心
global.ylog = require('./plugins/log4')({ console: { level: 'trace' } });//引入log4 并取名 ylog
const baseConfig = require('./config/base');
require('./app/yoyomysql');
const path = require('path');
const http = require("http");
const Koa = require("koa");
const serve = require("koa-static");
const cors = require('@koa/cors');
const body = require("koa-body");
const VueView = require('koa-vue-view');
const functions = require("./app/function");//引入全局函数库
const gmiddleware = require('./app/middleware');//引入全局中间件
const routers = require("./router/index");
const websocket = require("./plugins/websocket");//引入websocket插件扩展
const defense = require("./plugins/defense");//引入defense插件扩展
// const myRedis = require("./plugins/myRedis");//引入myRedis插件扩展
const cache = require("./plugins/cache");//引入cache插件扩展
const mailer = require("./plugins/mailer");//引入mailer插件扩展邮件
// const twoWayErt = require("./plugins/twoWayErt");//引入twoWayErt插件扩展双向加密(可以选择性使用 需要 封装客户端)
const error_json = require("./plugins/error_json");//引入error_json

global.CONFIG = baseConfig;//设置全局


/**
 * 开启多线程
 */
// if (cluster.isMaster) {
//   console.log(`Master ${process.pid} is running`);
//   for (let i = 0; i < numCPUs; i++) {
//     cluster.fork();
//   }
//   cluster.on('exit', (worker, code, signal) => {
//     console.log(`worker ${worker.process.pid} died`);
//   });
// } else {
//   runKoa();
// }


runKoa();

/**
 * 运行koa2
 */
function runKoa() {
  // 实例化 koa2
  const app = new Koa();
  app.proxy = true;
  //错误信息
  app.use(error_json());
  // 设置跨域请求
  app.use(cors());
  // 静态文件处理
  app.use(serve(__dirname + "/static", {
    maxage: 60000 * 5,//缓存毫秒
  }));
  //缓存
  app.use(cache());

  //redis数据库
  // app.use(myRedis());


  app.use(VueView({
    methodName: 'render',//在koa ctx注册渲染视图的方法名，默认render
    components: {
      koaContent: path.resolve(__dirname, './app/views/koaContent.vue')
    }
  }));

  //全局方法
  app.use(functions());
  //koa-body 结构体
  app.use(body({
    multipart: true,
    formidable: {
      maxFileSize: 200 * 1024 * 1024    // 设置上传文件大小最大限制200M
    }
  }));
  //创建服务
  const server = http.createServer(app.callback());
  //引入websocket
  app.use(websocket(server));
  //安全防护
  app.use(defense);
  //引入双向加密(可以选择性使用 需要 封装客户端)
  // app.use(twoWayErt());
  //注册全局中间件
  app.use(gmiddleware);
  // 挂载邮箱插件
  app.use(mailer());
  // 注册路由
  app.use(routers.routes()).use(routers.allowedMethods());
  //挂载端口 并启动服务器
  server.listen(baseConfig.port, () => {
    // if (process.env.NODE_ENV !== 'production') {
    //   console.log('当前是开发环境运行，如果是正式发布请用 npm run start 运行');
    // }
    console.log("open server " + baseConfig.host + " -- " + baseConfig.host.replace(/^(http(s)?:)/, "ws$2:"));
  });
}